﻿using Library.Collections;
using Library.Collections.Generic;
using Library.Logic.Inference;
using System;
using System.Linq;
using System.Linq.Expressions;
using TRULE = System.Linq.Expressions.Expression<System.Func<System.Linq.IQueryable<System.Linq.Expressions.Expression>, System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<System.Linq.Expressions.Expression>>>>;
using TEXPRESSION = System.Linq.Expressions.Expression;
using TPARAMETEREXPRESSION = System.Linq.Expressions.ParameterExpression;

namespace Library.Logic.Constraints
{
    public interface IConstraintsReadOnly : IHasInputParameters, IContainer<TEXPRESSION>, ICountable, ICloneable, IQueryable<TEXPRESSION>
    {
        bool Validate(object[] args);
    }

    public interface IConstraints : IConstraintsReadOnly, IEnsureContains<TEXPRESSION> { }

    public interface IConstraintsReasonReadOnly : IConstraintsReadOnly
    {
        TPARAMETEREXPRESSION ArgumentParameter { get; }

        bool Validate(object[] args, out IInference argument);
    }

    public interface IConstraintsReason : IConstraintsReasonReadOnly, IConstraints, IEnsureContains<TEXPRESSION> { }
}
